import moment from "moment";

/**
 * 时间格式化工具函数
 *
 * 使用示例：
 *
 * // 基础时间格式化
 * formatTime(1640995200000) // "2022-01-01 08:00:00"
 * formatTime(new Date()) // "2024-01-15 14:30:25"
 * formatTime('2022-01-01') // "2022-01-01 00:00:00"
 *
 * // 自定义格式
 * formatTime(1640995200000, 'YYYY/MM/DD') // "2022/01/01"
 * formatTime(1640995200000, 'MM-DD HH:mm') // "01-01 08:00"
 *
 * // 其他格式化函数
 * formatDate(1640995200000) // "2022-01-01"
 * formatTimeOnly(1640995200000) // "08:00:00"
 * formatDateTime(1640995200000) // "01-01 08:00"
 * formatTimeCN(1640995200000) // "2022年01月01日 08:00:00"
 *
 * // 相对时间和判断
 * getRelativeTime(Date.now() - 3600000) // "1小时前"
 * isToday(new Date()) // true
 * isThisWeek(Date.now() - 86400000) // true
 *
 * // 时长计算
 * getDuration('2022-01-01 08:00:00', '2022-01-01 10:30:00') // 150 (分钟)
 * formatDuration('2022-01-01 08:00:00', '2022-01-01 10:30:00') // "2小时30分钟"
 */

/**
 * 格式化时间戳为标准日期时间格式
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @param format 格式化模板，默认为 'YYYY-MM-DD HH:mm:ss'
 * @returns 格式化后的时间字符串
 */
export const formatTime = (
  timestamp: string | number | Date,
  format = "YYYY-MM-DD HH:mm:ss"
): string => {
  if (!timestamp) return "-";
  return moment(timestamp).format(format);
};

/**
 * 格式化时间戳为日期格式（年-月-日）
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 格式化后的日期字符串
 */
export const formatDate = (timestamp: string | number | Date): string => {
  return formatTime(timestamp, "YYYY-MM-DD");
};

/**
 * 格式化时间戳为时间格式（时:分:秒）
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 格式化后的时间字符串
 */
export const formatTimeOnly = (timestamp: string | number | Date): string => {
  return formatTime(timestamp, "HH:mm:ss");
};

/**
 * 格式化时间戳为短日期时间格式
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 格式化后的时间字符串
 */
export const formatDateTime = (timestamp: string | number | Date): string => {
  return formatTime(timestamp, "MM-DD HH:mm");
};

/**
 * 格式化时间戳为中文日期时间格式
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 格式化后的时间字符串
 */
export const formatTimeCN = (timestamp: string | number | Date): string => {
  return formatTime(timestamp, "YYYY年MM月DD日 HH:mm:ss");
};

/**
 * 获取相对时间（如：1小时前、3天前等）
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 相对时间字符串
 */
export const getRelativeTime = (timestamp: string | number | Date): string => {
  if (!timestamp) return "-";
  return moment(timestamp).fromNow();
};

/**
 * 判断是否是今天
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 是否是今天
 */
export const isToday = (timestamp: string | number | Date): boolean => {
  if (!timestamp) return false;
  return moment(timestamp).isSame(moment(), "day");
};

/**
 * 判断是否是本周
 * @param timestamp 时间戳（毫秒）或日期字符串
 * @returns 是否是本周
 */
export const isThisWeek = (timestamp: string | number | Date): boolean => {
  if (!timestamp) return false;
  return moment(timestamp).isSame(moment(), "week");
};

/**
 * 获取两个时间之间的时长
 * @param startTime 开始时间
 * @param endTime 结束时间
 * @param unit 单位（'days', 'hours', 'minutes', 'seconds'）
 * @returns 时长数值
 */
export const getDuration = (
  startTime: string | number | Date,
  endTime: string | number | Date,
  unit: "days" | "hours" | "minutes" | "seconds" = "minutes"
): number => {
  if (!startTime || !endTime) return 0;
  const start = moment(startTime);
  const end = moment(endTime);
  return end.diff(start, unit);
};

/**
 * 格式化时长为可读格式
 * @param startTime 开始时间
 * @param endTime 结束时间
 * @returns 格式化的时长字符串（如：2小时30分钟）
 */
export const formatDuration = (
  startTime: string | number | Date,
  endTime: string | number | Date
): string => {
  if (!startTime || !endTime) return "-";

  const start = moment(startTime);
  const end = moment(endTime);
  const duration = moment.duration(end.diff(start));

  const days = Math.floor(duration.asDays());
  const hours = duration.hours();
  const minutes = duration.minutes();

  let result = "";
  if (days > 0) result += `${days}天`;
  if (hours > 0) result += `${hours}小时`;
  if (minutes > 0) result += `${minutes}分钟`;

  return result || "0分钟";
};

// 获取分值，0分也算有分值，没有分值返回--
export const getScore = (score: number | null | undefined): string => {
  if (
    score === null ||
    score === undefined ||
    typeof score !== "number" ||
    !isFinite(score)
  ) {
    return "--";
  }

  if (Number.isInteger(score)) {
    return score + "分";
  }

  return score.toFixed(2) + "分";
};
